//
//  HMCompostTextView+Extension.swift
//  Weibo
//
//  Created by teacher on 2017/6/16.
//  Copyright © 2017年 teacher. All rights reserved.
//

import UIKit

extension HMComposeTextView {
    //  获取富文本对应的微博内容
    var emoticonText: String {
        var result = ""
        //  在指定范围遍历textView的富文本获取对应的表情描述和普通的字符串，然后进行拼接发送给后台
        self.attributedText.enumerateAttributes(in: NSMakeRange(0, self.attributedText.length), options: []) { (info, range, _) in
            //  info: 富文本信息
            //  range: 富文本对应的范围
            print(info)
            //  nsrange转字符串
            print(NSStringFromRange(range))
            //  判断是否是图片表情
            if let attachment = info["NSAttachment"] as? HMEmoticonTextAttachment {
                //  图片表情， 表情富文本
                let chs = attachment.emoticon!.chs!
                result += chs
                
            } else {
                //  普通字符串富文本
                let subAttributedStr = self.attributedText.attributedSubstring(from: range)
                //  获取富文本对应的字符串
                let text = subAttributedStr.string
                result += text
            }
        }
        
        return result
    }
    
    //  根据表情模型插入富文本或者emoji
    func insertEmoticon(emoticon: HMEmoticon) {
        if emoticon.type == "0" {
            //  图片表情， 有图片表情需要设置textView的富文本
            //  把图片转成富文本的流程
            //  记录之前textView的富文本
            let lastAttributedText = NSMutableAttributedString(attributedString: self.attributedText)
//            //  1. 创建UIImage对象
//            let image = UIImage(named: emoticon.path!, in: EmoticonButton, compatibleWith: nil)
//            //  2. 创建文本附件(NSTextAttachment)
//            let attachment = HMEmoticonTextAttachment()
//            //  文本附件关联表情模型
//            attachment.emoticon = emoticon
//            //  获取文字的高度
//            let lineHeight = self.font!.lineHeight
//            //  设置bounds， 设置文本附件的bounds会影响image的显示位置，在父子视图里面，设置父视图的bounds会影响子视图的显示位置
//            attachment.bounds = CGRect(x: 0, y: -4, width: lineHeight, height: lineHeight)
//            //  3. 设置文本附件对应的图片对象
//            attachment.image = image
//            //  4. 根据文本附件创建富文本
//            let emoticonAttributeText = NSAttributedString(attachment: attachment)
            let emoticonAttributeText = NSAttributedString.attributedStringWithEmoticon(emoticon: emoticon, font: self.font!)
            //  5. 设置富文本
            //            lastAttributedText.append(emoticonAttributeText)
            //  获取选中范围的富文本
            
            var range = self.selectedRange
            //  替换选中范围的富文本
            lastAttributedText.replaceCharacters(in: range, with: emoticonAttributeText)
            //  设置富文本的字体大小
            lastAttributedText.addAttributes([NSFontAttributeName: self.font!], range: NSMakeRange(0, lastAttributedText.length))
            self.attributedText = lastAttributedText
            //  点击表情让其光标位置在表情后面，所以需要加1
            range.location += 1
            //  设置长度为0作为光标
            range.length = 0
            //  最后设置选中的光标
            self.selectedRange = range
            //  设置富文本的不会执行文字改变通知或者代理方法
            //  手动发送文字改变的通知
            NotificationCenter.default.post(name: NSNotification.Name.UITextViewTextDidChange, object: nil)
            //  手动使用代理对象调用代理方法
            //  ? 表示判断这个代理对象是否实现了代理方法，如果实现了那么执行代理方法，否则返回nil
            self.delegate?.textViewDidChange?(self)
            
        } else {
            //  emoji表情
            let emoji = (emoticon.code! as NSString).emoji()
            //  设置textView内容, 插入到光标后面
            self.insertText(emoji!)
        }
    }
    
}
